Nie można znaleźć pliku deklaracji dla modułu 'Nazwa modułu'. '/path / to / module-name.js"

Czytałem jak działa TypeScript Rozdzielczość modułu .

Mam następujące repozytorium: @ ts-stack / di . Po skompilowaniu struktura katalogów wygląda następująco:

├── dist
│   ├── annotations.d.ts
│   ├── annotations.js
│   ├── index.d.ts
│   ├── index.js
│   ├── injector.d.ts
│   ├── injector.js
│   ├── profiler.d.ts
│   ├── profiler.js
│   ├── providers.d.ts
│   ├── providers.js
│   ├── util.d.ts
│   └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│   ├── annotations.ts
│   ├── index.ts
│   ├── injector.ts
│   ├── profiler.ts
│   ├── providers.ts
│   └── util.ts
└── tsconfig.json
W mojej paczce.json I wrote "main": "dist/index.js".

W Węźle.js wszystko działa dobrze, ale maszynopis:

import {Injector} from '@ts-stack/di';

Nie można znaleźć pliku deklaracji dla modułu '@ ts-stack / di'. '/path / to/node_modules / @ ts-stack/di/dist / index.js "implicite ma "any" Typ.

A jednak, jeśli importuję w następujący sposób, to wszystko działa:

import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Co robię źle?
Author: ktretyak, 2016-12-22

16 answers

Oto dwa inne rozwiązania

Gdy moduł nie jest Twój-spróbuj zainstalować typy z @types:

npm install -D @types/module-name

Jeśli powyższe błędy instalacji-spróbuj zmienić import na require:

// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');
 396
Author: ktretyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-17 17:02:40

Jeśli importujesz zewnętrzny moduł 'foo', który nie zawiera żadnych typowań, ani w samej bibliotece, ani w pakiecie @types/foo (wygenerowanym z repozytorium DefinitelyTyped ), możesz usunąć ten błąd, deklarując moduł w pliku z rozszerzeniem .d.ts. TypeScript szuka plików .d.ts w tych samych miejscach, w których będzie szukał zwykłych plików .ts: jak określono w "files", "include" I "exclude" w tsconfig.json.

// foo.d.ts
declare module 'foo';

Then when you import foo zostanie wpisany jako any.


Alternatywnie, jeśli chcesz rzucić własne typy, możesz to zrobić również:

// foo.d.ts
declare module 'foo' {
    export function getRandomNumber(): number
} 

To będzie poprawnie skompilowane:

import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number

Nie musisz podawać pełnych typowań dla modułu, wystarczy dla bitów, których faktycznie używasz( i dla których chcesz poprawnie pisać), więc jest to szczególnie łatwe, jeśli używasz dość małej ilości API.


Z drugiej strony, jeśli nie zależy ci na typowanie bibliotek zewnętrznych i chcesz, aby wszystkie biblioteki bez typowania były importowane jako any, możesz dodać to do pliku z rozszerzeniem .d.ts:

declare module '*';

Zaletą (i minusem) tego jest to, że możesz zaimportować absolutnie wszystko, a TS się skompiluje.

 386
Author: Retsam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-16 21:29:45

Jeśli potrzebujesz szybkiej poprawki, po prostu dodaj ją przed wierszem importu:

// @ts-ignore
 200
Author: Liran H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-05 12:04:28

To uczucie, gdy patrzysz przez dwa dni i znajdujesz je w ten sposób: po prostu usuń .js z "main": "dist/index.js" w package.json i wszystko działa dobrze!

"main": "dist/index",

UPD : ta odpowiedź jest względna, jeśli masz własny pakiet npm, jeśli nie - zobacz moją odpowiedź poniżej .

I jeśli powyższa odpowiedź nie została rozwiązana zaimportuj swój moduł, spróbuj po prostu dodać typings W package.json:

"main": "dist/index",
"typings": "dist/index",

Oczywiście, tutaj folder dist - to miejsce, w którym przechowywane są pliki twojego modułu.

 106
Author: ktretyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

TypeScript to w zasadzie implementacja reguł i dodawanie typów do kodu, aby uczynić go bardziej przejrzystym i dokładniejszym ze względu na brak ograniczeń w Javascript. TypeScript wymaga opisania danych, aby kompilator mógł sprawdzić kod i znaleźć błędy. Kompilator poinformuje cię, jeśli używasz typów niedopasowanych, jeśli nie masz zakresu lub próbujesz zwrócić inny typ. Tak więc, gdy używasz zewnętrznych bibliotek i modułów z maszynopisem, muszą one zawierać pliki opisujące typy w tym kodzie. Pliki te nazywane są plikami deklaracji typu z rozszerzeniem d.ts. Większość typów deklaracji dla modułów npm jest już zapisana i można je załączyć za pomocą npm install @types/module_name (gdzie module_name jest nazwą modułu, którego typy chcesz załączyć).

Istnieją jednak moduły, które nie mają definicji typu i aby usunąć błąd i zaimportować moduł za pomocą import * as module_name from 'module-name', Utwórz folder typings w katalogu głównym Twój projekt, wewnątrz utwórz nowy folder z nazwą modułu i w tym folderze Utwórz plik module_name.d.ts i zapisz declare module 'module_name'. Następnie przejdź do pliku tsconfig.json i dodaj "typeRoots": [ "../../typings", "../../node_modules/@types"] w compilerOptions (z odpowiednią ścieżką względną do folderów), aby TypeScript wiedział, gdzie może znaleźć definicje typów bibliotek i modułów i dodać nową właściwość "exclude": ["../../node_modules", "../../typings"] do pliku. Oto przykład twojego tsconfig.plik json powinien wyglądać następująco:

{
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "sourceMap": true,
        "outDir": "../dst/",
        "target": "ESNEXT",
        "typeRoots": [
            "../../typings",
            "../../node_modules/@types"
        ]
    },
    "lib": [
            "es2016"
    ],
    "exclude": [
        "../../node_modules",
        "../../typings"
    ]
}

Robiąc to, błąd zniknie i będziesz mógł trzymać się najnowszych reguł ES6 i maszynopisu.

 51
Author: Marko Rochevski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 09:17:16

Jeśli ktoś jeszcze to czyta, spróbuj zmienić nazwę swojego .plik js do .ts

Edytuj: Możesz również dodać "allowJs": true do pliku tsconfig.

 28
Author: Martin Lockett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-07 11:00:55

Ten sposób działa dla mnie:

1. dodaj własną deklarację do pliku deklaracji, takiego jak index.d. ts (może pod korzeniem projektu)
declare module 'Injector';
2. dodaj swój indeks.d. ts do tsconfig.json
  {
    "compilerOptions": {
        "strictNullChecks": true,
        "moduleResolution": "node",
        "jsx": "react",
        "noUnusedParameters": true,
        "noUnusedLocals": true,
        "allowSyntheticDefaultImports":true,
        "target": "es5",
        "module": "ES2015",
        "declaration": true,
        "outDir": "./lib",
        "noImplicitAny": true,
        "importHelpers": true
      },
      "include": [
        "src/**/*",
        "index.d.ts",   // declaration file path
      ],
      "compileOnSave": false
    }

-- edit: potrzebne cudzysłowy wokół nazwy modułu

 19
Author: Lumaskcete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-19 07:39:23

Miałem ten sam problem przy użyciu modułu węzła z aplikacją reactową napisaną maszynopisem. Moduł został pomyślnie zainstalowany przy użyciu npm i --save my-module. Jest napisany w javascript i eksportuje klasę Client.

Z:

import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();

Kompilacja nie powiodła się z błędem:

Could not find a declaration file for module 'my-module'. 
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
  Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`

@types/my-module nie istnieje, więc dodałem plik my-module.d.ts obok tego, do którego importowany jest my-module, z sugerowaną linią. Potem dostałem błąd:

Namespace '"my-module"' has no exported member 'Client'.

Klient jest faktycznie eksportowany i działa Normalnie, jeśli używam go w aplikacji js. Również poprzedni komunikat mówi mi, że kompilator szuka w odpowiednim pliku ({[9] } jest zdefiniowany w my-module/package.json "main" element).

Rozwiązałem problem mówiąc kompilatorowi, że nie dbam o implicit any, czyli ustawiłem na false następujący wiersz pliku tsconfig.json:

    "noImplicitAny": false,
 6
Author: Kanthavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-25 14:45:02

Musisz edytować plik konfiguracyjny maszynopisu (tsconfig.json) i dodać nową parę klucz-wartość jako:

"noImplicitAny": false

Na Przykład: "noImplicitAny": false, "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, Kontynuuj....

 5
Author: Ali Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-01 16:32:11

Niestety nie mamy wpływu na to, czy autor pakietu będzie przeszkadzał z plikiem deklaracji. Zazwyczaj mam taki plik index.d.ts, który będzie zawierał wszystkie brakujące pliki deklaracji z różnych pakietów:

Indeks.ts:

declare module 'v-tooltip';
declare module 'parse5';
declare module 'emoji-mart-vue-fast';
 4
Author: Luke Garrigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-19 16:12:37

Próbowałem wszystkiego tutaj, ale dla mnie to był zupełnie inny problem: Musiałem usunąć z mojego *.d.ts wszelkie polecenia importu:

import { SomeModuleType } from '3rd-party-module';

Po usunięciu błędu zniknął...

Wyjaśnienie : Kiedy deklarujemy moduł w pliku *.d.ts, jest on automatycznie pobierany przez kompilator maszynopisu jako moduł ambient (ten, którego nie trzeba importować jawnie). Po określeniu import ... from ..., Plik staje się teraz normalnym modułem (ES6), a zatem nie będzie odebrany automatycznie. Dlatego jeśli nadal chcesz, aby zachowywał się jak moduł ambient, użyj innego stylu importu, jak tak:

type MyType: import('3rd-party-module').SomeModuleType;
 3
Author: Ilyas Assainov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-17 05:08:44

Sprawdź w pliku "tsconfig.json" opcje kompilacji "include" i "exclude". Jeśli nie istnieje, po prostu dodaj je informując swój korzeń katalog.

// tsconfig.json
{
  "compilerOptions": {
  ...
  "include": [
    "src", 
  ],
  "exclude": [
    "node_modules", 
  ]
}

Rozwiązałem swój głupi problem po prostu usuwając instrukcję rozszerzenia "*.spec.ts" z "exclude", ponieważ przy włączaniu "import" w tych plikach zawsze pojawiały się problemy.

 3
Author: thiagosilva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-27 17:08:39

Ja też to dostawałem, przez jakiś czas byłem zdumiony, nawet z modułem i typami już zainstalowanymi i wielokrotnie przeładowywałem moje IDE.

To, co naprawiłem w moim przypadku, to kończenie procesów terminalowych, usuwanie node_modules, czyszczenie pamięci podręcznej menedżera pakietów węzłów i robienie świeżego install, a następnie ponowne ładowanie edytora.

 2
Author: Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 14:24:10

Proste do naprawienia jest re:

// example.d.ts
declare module 'foo';

Jeśli chcesz zadeklarować interfejs obiektu (polecam dla dużego projektu) możesz użyć :

// example.d.ts
declare module 'foo'{
    // example
    export function getName(): string
}
Jak tego użyć? proste..
const x = require('foo') // or import x from 'foo'
x.getName() // intellisense can read this
 2
Author: Abdul Aziz Al Basyir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-21 14:18:33
Could not find a declaration file for module 'busboy'. 'f:/firebase-cloud- 
functions/functions/node_modules/busboy/lib/main.js' implicitly has an ‘any’ 
type.

Try `npm install @types/busboy` if it exists or add a new declaration (.d.ts) 
the file containing `declare module 'busboy';`

W moim przypadku jest to rozwiązane: wystarczy edytować plik konfiguracyjny maszynopisu (tsconfig.json) i dodać nową parę klucz-wartość jako:

"noImplicitAny": false
 -4
Author: Rao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-10 14:53:58

Po prostu możesz zaimportować go za pomocą require jako następujący kod:

var _ = require('your_module_name');
 -8
Author: Riyad Khalifeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 17:04:48